<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
      ①确定dp数组和下标含义：dp[i]表示用i个节点构成的二叉搜索树的个数
      ②状态转移方程：
      i==3 dp[3]=左边0右边2+左边1右边1+左边2右边1
           dp[3]=dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]
           
           dp[i]=dp[0]*dp[i-1-0]+dp[1]*dp[i-1-1]+dp[2]*dp[i-1-0]
           因此，我们需要额外导入变量j j<i
           dp[i]+=dp[j]*dp[i-1-j]
           
      ③初始化dp数组
      dp[0]=1 dp[1]=1

      */
      var numTrees = function (n) {
        let dp = new Array(n + 1).fill(0)
        dp[0] = 1
        dp[1] = 1
        for (let i = 2; i <= n; i++) {
          for (let j = 0; j < i; j++) {
            dp[i] += dp[j] * dp[i - j - 1]
          }
        }
        return dp[n]
      }
    </script>
  </body>
</html>
